package com.example.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.common.jwt.JwtTokenUtils;
import com.example.dao.ImFriendMapper;
import com.example.dao.UserMapper;
import com.example.entity.ImFriend;
import com.example.entity.User;
import com.example.entity.UserDTO;
import com.zaxxer.sparsebits.SparseBitSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ImFriendService extends ServiceImpl<ImFriendMapper, ImFriend> {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private ImFriendMapper imFriendMapper;



    // 根据用户名查询用户
    public User SearchFriend(String username) {
        // 使用 QueryWrapper 构造查询条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", username); // 查询 name 字段与传入的用户名匹配的用户

        // 使用 userMapper 查询数据库，返回结果
        User user = userMapper.selectOne(queryWrapper);

        // 如果没有找到该用户，返回 null
        return user;
    }

    /**
     * 判断是否已经发送过好友申请
     * @param userId 当前用户 ID
     * @param friendId 好友的 ID
     * @return boolean 是否已发送申请
     */
    public boolean hasAlreadyApplied(Integer userId, Integer friendId) {
        // 创建 QueryWrapper 查询条件
        QueryWrapper<ImFriend> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId)           // 用户 ID
                .eq("friend_id", friendId)     // 好友 ID
                .eq("is_apply", 1)             // 申请状态为“申请中”
                .ne("is_delete", 1);           // 排除删除状态为1的记录（如果有删除状态）

        // 执行查询
        ImFriend existingRequest = imFriendMapper.selectOne(queryWrapper);

        // 如果已有申请且状态为申请中，则返回 true
        return existingRequest != null;
    }

    /**
     * 申请好友请求
     * @param friendId
     */
    @Transactional  // 确保操作的事务性
    public void SendApply(Integer friendId) {
        Integer friendIdInt = friendId;  // 好友 ID
        User currentUser = JwtTokenUtils.getCurrentUser();
        Integer currentUserId = currentUser.getId();

        // 检查是否已经申请过好友
        if (hasAlreadyApplied(currentUserId, friendIdInt)) {
            throw new RuntimeException("你已发送过申请，请等待对方处理。");
        }

        // 创建好友申请对象
        ImFriend imFriend = new ImFriend();
        imFriend.setUserId(currentUserId);          // 设置当前用户的 ID
        imFriend.setFriendId(friendIdInt);   // 设置好友的 ID
        imFriend.setIsApply(1);               // 申请状态设置为 1（表示申请中）
        imFriend.setIsAgree(0);               // 同意状态设置为 0（表示未同意）
        imFriend.setIsDelete(0);              // 删除状态设置为 0（表示没有删除）

        // 插入申请记录到数据库
        imFriendMapper.insert(imFriend);
    }

    /**
     * 展示当前用户请求列表
     * @return 当前用户的好友申请列表
     */
    public List<User> getApplyList() {
        // 查询符合条件的好友申请：isApply = 1, isAgree = 0, isDelete = 0
        QueryWrapper<ImFriend> queryWrapper = new QueryWrapper<>();
        User currentUser = JwtTokenUtils.getCurrentUser();
        Integer currentUserId = currentUser.getId();
        queryWrapper.eq("friend_id", currentUserId) // 当前用户是好友的接收方
                .eq("is_apply", 1)  // 申请状态是1（申请中）
                .eq("is_agree", 0)  // 同意状态是0（未同意）
                .eq("is_delete", 0); // 删除状态是0（未删除）

        // 查询好友申请记录
        List<ImFriend> imFriendList = imFriendMapper.selectList(queryWrapper);

        // 提取申请者信息
        List<User> applyUsers = imFriendList.stream()
                .map(imFriend -> userMapper.selectById(imFriend.getUserId()))  // 根据 userId 查询用户
                .collect(Collectors.toList());

        return applyUsers;
    }
    public List<User> getFriendsList() {
        // 获取当前登录用户的信息
        User currentUser = JwtTokenUtils.getCurrentUser();
        Integer currentUserId = currentUser.getId();
        // 查询符合条件的好友：isApply = 1, isAgree = 1, isDelete = 0
        QueryWrapper<ImFriend> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_apply", 1)
                .eq("is_agree", 1)  // 仅当 is_agree 为 1（同意）时返回
                .eq("is_delete", 0) // 删除状态为0（未删除）
                .and(wrapper -> wrapper.eq("friend_id", currentUserId).or().eq("user_id", currentUserId));
        // 查询好友记录
        List<ImFriend> imFriendList = imFriendMapper.selectList(queryWrapper);

        // 提取好友信息
        List<User> userFriends = new ArrayList<>();

        // 遍历每一条好友记录，获取申请人和被申请人的用户信息
        for (ImFriend imFriend : imFriendList) {
            // 如果当前用户是申请人，则获取被申请人的信息
            if (imFriend.getUserId().equals(currentUserId)) {
                User friendUser = userMapper.selectById(imFriend.getFriendId()); // 获取被申请人的信息
                if (friendUser != null) {
                    userFriends.add(friendUser);
                }
            }
            // 如果当前用户是被申请人，则获取申请人的信息
            else if (imFriend.getFriendId().equals(currentUserId)) {
                User applicantUser = userMapper.selectById(imFriend.getUserId()); // 获取申请人的信息
                if (applicantUser != null) {
                    userFriends.add(applicantUser);
                }
            }
        }

        return userFriends;
    }


    /**
     * 同意好友请求
     * @param userId 好友申请者的用户ID
     */
    @Transactional  // 确保操作的事务性
    public void AgreeApply(Integer userId) {
        User currentUser = JwtTokenUtils.getCurrentUser();
        Integer currentUserId = currentUser.getId();
        Integer friendId =  currentUserId;// 当前用户的 ID

        // 查询当前用户的申请记录，判断是否符合条件
        QueryWrapper<ImFriend> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId)      // 申请者是传入的 userId
                .eq("friend_id", friendId)  // 当前用户是申请记录的接收方
                .eq("is_apply", 1)         // 申请状态为 1
                .eq("is_agree", 0)         // 同意状态为 0
                .eq("is_delete", 0);       // 删除状态为 0

        ImFriend imFriend = imFriendMapper.selectOne(queryWrapper);

        if (imFriend != null) {
            // 修改同意状态为 1（表示已同意）
            imFriend.setIsAgree(1);
            imFriendMapper.updateById(imFriend);  // 更新数据库记录
        } else {
            throw new RuntimeException("未找到待同意的好友请求！");
        }
    }
}
